/*
 *  Copyright (c) 2010 Brian Stanek <bstanek@gmail.com>
 *
 *  Permission is hereby granted, free of charge, to any person
 *  obtaining a copy of this software and associated documentation
 *  files (the "Software"), to deal in the Software without
 *  restriction, including without limitation the rights to use,
 *  copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the
 *  Software is furnished to do so, subject to the following
 *  conditions:
 *
 *  The above copyright notice and this permission notice shall be
 *  included in all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *  OTHER DEALINGS IN THE SOFTWARE.
 */

package guice
{

import guice.binder.AnnotatedBindingBuilder;
import guice.binder.AnnotatedConstantBindingBuilder;
import guice.binder.LinkedBindingBuilder;
import guice.spi.Message;

public class AbstractModule implements Module
{

    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------

    private var binder:Binder = null;

    //--------------------------------------------------------------------------
    //
    //  Methods: Module
    //
    //--------------------------------------------------------------------------

    public final function configure(binder:Binder):void
    {
        if (this.binder != null)
        {
            throw new Error("re-entry not allowed");
        }
        this.binder = binder;
        configureInternal();
        this.binder = null;
    }

    //--------------------------------------------------------------------------
    //
    //  Binder Methods
    //
    //--------------------------------------------------------------------------

    protected function addError(errorOrMessage:*):void
    {
        binder.addError(errorOrMessage);
    }

    protected function bindType(type:Class):AnnotatedBindingBuilder
    {
        return binder.bindType(type);
    }

    protected function bindConstant():AnnotatedConstantBindingBuilder
    {
        return binder.bindConstant();
    }

    protected function bindKey(key:Key):LinkedBindingBuilder
    {
        return binder.bindKey(key);
    }

    protected function currentStage():Stage
    {
        return binder.currentStage();
    }

    protected function getProviderForType(type:Class):void
    {
        binder.getProviderForType(type);
    }

    protected function getProviderForKey(key:Key):void
    {
        binder.getProviderForKey(key);
    }

    protected function install(module:Module):void
    {
        binder.install(module);
    }

    protected function requestInjection(instance:Object):void
    {
        binder.requestInjection(instance);
    }

    protected function requestStaticInjection(...types):void
    {
        binder.requestStaticInjection.apply(binder, types);
    }

    //--------------------------------------------------------------------------
    //
    //  Methods
    //
    //--------------------------------------------------------------------------

    protected function requireBindingForType(type:Class):void
    {
        binder.getProviderForType(type);
    }

    protected function requireBindingForKey(key:Key):void
    {
        binder.getProviderForKey(key);
    }

    //--------------------------------------------------------------------------
    //
    //  Abstract Methods
    //
    //--------------------------------------------------------------------------

    protected function configureInternal():void
    {
    }

}

}
